﻿#ifndef OPCUA_H
#define OPCUA_H

#include "open62541.h"

class OpcUA
{
public:
    OpcUA();

    /**
     * @brief OpcUA_Init
     * @param endpointUrl   opc.tcp://127.0.0.1:49320
     * @return
     */
    bool OpcUA_Init(QString endpointUrl);

    /**
     * @brief readValveStatus 想要读取阀门1的状态，第一个参数就输入1，最小输入参数是1
     * @param valveChannel  要读取的通道N
     * @param result        输出的结果参数
     * @return
     */
    bool readValveStatus(int valveChannel, bool& result);
    bool readAllValveStatus(QVector<bool>& result);

    /**
     * @brief writeValveStatus  想要写入阀门1的状态，第一个参数就输入1，最小输入参数是1
     * @param valveChanel   要写入的通道N
     * @param status        写入的参数
     * @return
     */
    bool writeValveStatus(int valveChannel, bool status);
    bool writeAllValveStatus(QVector<bool> status);

    /**
     * @brief readFlowRate  读取流量数据，最大返回值24576，需要转化为SCCM
     * @param flowmeterChannel  要读取的通道N
     * @param result            输出的结果
     * @return
     */
    bool readFlowRate(int flowmeterChannel, int16_t& result);
    bool readAllFlowRate(QVector<int16_t>& result);

    /**
     * @brief writeFlowRate  写入流量数据，最大值24576
     * @param flowmeterChannel  要写入的通道N
     * @param inputValue        写入值
     * @return
     */
    bool writeFlowRate(int flowmeterChannel, int16_t inputValue);
    bool writeAllFlowRate(QVector<int16_t> inputValue);

    /**
     * @brief readPressure  读取压力数据，最大返回值24576，需要转化为kpa
     * @param pressuremeterChannel  要读取的通道N
     * @param result            输出的结果
     * @return
     */
    bool readPressure(int pressuremeterChannel, int16_t& result);
    bool readAllPressure(QVector<int16_t>& result);

    /**
     * @brief writePressure  写入压力数据，最大值24576
     * @param pressuremeterChannel  要写入的通道N
     * @param inputValue        写入值
     * @return
     */
    bool writePressure(int pressuremeterChannel, int16_t inputValue);
    bool writeAllPressure(QVector<int16_t> inputValue);


    /**
     * @brief readMKS           读取mks当前状态
     * @param pressure          返回压力值，0-20000，表示0-2666kpa
     * @param openingAmplitude  返回开度值，0-20000，表示0-100%
     * @return
     */
    bool readMKS(int16_t& pressure, int16_t& openingAmplitude);

    /**
     * @brief writeMKS          设定mks状态
     * @param pressure          设置压力值，0-20000，表示0-2666kpa
     * @param openingAmplitude  设置开度值，0-20000，表示0-100%
     * @param switchMode        1设置开度模式，2设置压力模式
     * @return
     */
    bool writeMKS(int16_t pressure, int16_t openingAmplitude, int16_t switchMode);


    /**
     * @brief readTemperature   读取设备温度参数
     * @param temperature1      温度1
     * @param temperature2      温度2
     * @return
     */
    bool readTemperature(int16_t& temperature1, int16_t& temperature2);

    /**
     * @brief writeTemperature  写入温度参数
     * @param status            设置温控表的状态
     * @param temperature1      设定温度1
     * @param temperature2      设定温度2
     * @return
     */
    bool writeTemperature(bool status, int16_t temperature1, int16_t temperature2);


    bool readOtherValveStatus(int valveChannel, bool & result);

    bool readOtherDataValue(int dataChannel, int16_t & result);

private:
    Open62541 * client;

};

#endif // OPCUA_H
